﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using AvaliacaoOnline.Model;
using AvaliacaoOnline.Data;

namespace Avaliacao.Controllers
{
    public class UsuarioController : BaseController
    {
        public ActionResult List(int? IdCliente)
        {
            if (Session["TipoUsuario"] as string != "A")
            {
                Response.Redirect(@"~\"); return View();
            }

            if (!IdCliente.HasValue)
                IdCliente = 0;

            List<Cliente> clientes = new ClienteRepository().GetClientes();
            ViewData["Clientes"] = clientes.Select(c => new SelectListItem()
            {
                Text = c.Nome,
                Value = c.Id.ToString(),
                Selected = IdCliente == c.Id
            }).ToList();

            if (clientes.Count == 0)
                return View();

            if (IdCliente.Value == 0)
                IdCliente = clientes.First().Id;

            List<AvaliacaoOnline.Data.Usuario> usuarios = new UsuarioRepository().GetUsuarios(IdCliente.Value);

            return View("List", usuarios);
        }

        public ActionResult ListAvaliacao(int IdCliente, int IdAvaliacao)
        {
            if (Session["TipoUsuario"] as string != "A")
            {
                Response.Redirect(@"~\"); return View();
            }

            List<AvaliacaoOnline.Data.Usuario> usuarios = new UsuarioRepository().GetUsuarios(IdCliente, IdAvaliacao);

            return PartialView("_ListAvaliacao", usuarios);
        }

        public ActionResult ListAvaliacaoNoUsuario(int idCliente, int idUsuario)
        {
            if (Session["TipoUsuario"] as string != "A")
            {
                Response.Redirect(@"~\"); return View();
            }

            var avaliacoes = new AvaliacaoRepository().GetAvaliacoes(idCliente).ToList();
            ViewData["AvaliacoesUsuario"] = new AvaliacaoRepository().GetAvaliacaoUsuario(idUsuario).Select(c => c.IdAvaliacao).ToList();

            return PartialView("_ListAvaliacaoNoUsuario", avaliacoes);
        }


        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult Edit()
        {
            if (Session["TipoUsuario"] as string != "A")
            {
                Response.Redirect(@"~\"); return View();
            }

            return Edit(-1);
        }

        public ActionResult Edit(int id)
        {
            if (Session["TipoUsuario"] as string != "A")
            {
                Response.Redirect(@"~\"); return View();
            }

            UsuarioRepository usuarioRepository = new UsuarioRepository();

            var usuario = usuarioRepository.GetUsuario(id);

            return Edit(usuario);
        }

        private ActionResult Edit(Usuario usuario)
        {
            List<Cliente> clientes = new ClienteRepository().GetClientes();
            ViewData["Clientes"] = clientes.Select(c => new SelectListItem()
            {
                Text = c.Nome,
                Value = c.Id.ToString(),
                Selected = (usuario == null) ? false : usuario.IdCliente == c.Id
            }).ToList();

            List<GrupoUsuario> grupos = new UsuarioRepository().GetGruposUsuario();
            ViewData["Grupos"] = grupos.Select(c => new SelectListItem()
            {
                Text = c.Descricao,
                Value = c.Id.ToString(),
                Selected = (usuario == null) ? false : usuario.IdGrupoUsuario == c.Id
            }).ToList();

            //prepara avaliacao nova se for o caso
            if (usuario == null)
            {
                usuario = new AvaliacaoOnline.Data.Usuario();
                usuario.Id = 0;
            }

            

            return View("Edit", usuario);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Save(AvaliacaoOnline.Data.Usuario usuario, string[] Avaliacoes, string[] AvaliacoesOriginais)
        {
            if (Session["TipoUsuario"] as string != "A")
            {
                Response.Redirect(@"~\"); return View();
            }

            Avaliacoes = Avaliacoes ?? new string[0];
            AvaliacoesOriginais = AvaliacoesOriginais ?? new string[0];

            UsuarioRepository repository = new UsuarioRepository();
            string erros = string.Empty;
            string erros2 = string.Empty;
            repository.GravarUsuario(usuario, ref erros);

            if (erros.Length == 0)
            {
                foreach (string aux in Avaliacoes)
                {
                    int idAvaliacao = Convert.ToInt32(aux);
                    repository.InserirUsuarioAvaliacao(usuario.Id, idAvaliacao);
                }
                int[] lstAvaliacaoRemover = AvaliacoesOriginais.Where(c => !Avaliacoes.Contains(c)).Select(c => int.Parse(c)).ToArray();
                foreach (int idAvaliacaoRemover in lstAvaliacaoRemover)
                {
                    repository.RemoverUsuarioAvaliacao(usuario.IdCliente, usuario.Id, idAvaliacaoRemover, ref erros2);
                }
            }

            if (erros.Length > 0)
            {
                ViewData["Message"] = erros.Replace(Environment.NewLine, "<br>");
                return Edit(usuario);
            }
            else
            {
                ViewData["Message"] = "Usuário atualizado com sucesso.";
                if (erros2.Length > 0)
                {
                    ViewData["Message"] += "<br><br>" + erros2;
                }

                return Edit(usuario.Id);
            }

        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Delete(int idCliente, int idUsuario)
        {
            if (Session["TipoUsuario"] as string != "A")
            {
                Response.Redirect(@"~\"); return View();
            }

            UsuarioRepository repository = new UsuarioRepository();
            string erros = string.Empty;
            repository.ExcluirUsuario(idUsuario, ref erros);

            if (erros.Length > 0)
            {
                ViewData["Message"] = erros.Replace(Environment.NewLine, "<br>");
                return List(idCliente);
            }
            else
            {
                ViewData["Message"] = "Usuário excluído com sucesso.";
                return List(idCliente);
            }

        }

        public JsonResult Carga(int idCliente, int idAvaliacao, string usuarios)
        {
            if (Session["TipoUsuario"] as string != "A")
            {
                return new JsonResult();
            }
            try
            {
                List<UsuarioModelo> lstUsuarios = new UsuarioService().ParseUsuarios(usuarios);

                UsuarioRepository usuarioRepository = new UsuarioRepository();
                string retorno = usuarioRepository.GravarUsuarios(idCliente, idAvaliacao, lstUsuarios);

                return new JsonResult() { Data = "Processamento executado com sucesso.<br><br>" + retorno.Replace(Environment.NewLine, "<br>") };
            }
            catch (Exception ex)
            {
                return new JsonResult() { Data = "Erro ao processar o arquivo<br><br>Message:<br>" + ex.Message };
            }
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public JsonResult RemoveAvaliacao(int idCliente, int idUsuario, int idAvaliacao)
        {
            if (Session["TipoUsuario"] as string != "A")
            {
                Response.Redirect(@"~\"); return null;
            }

            UsuarioRepository repository = new UsuarioRepository();
            string erros = string.Empty;
            repository.RemoverUsuarioAvaliacao(idCliente, idUsuario, idAvaliacao, ref erros);

            if (erros.Length > 0)
            {
                return new JsonResult()
                {
                    Data = erros.Replace(Environment.NewLine, "<br>")
                };
            }
            else
            {
                return new JsonResult()
                {
                    Data = "OK"
                };
            }

        }
    }
}
